import random
# https://blog.csdn.net/weixin_42563968/article/details/108549733?spm=1001.2101.3001.6650.8&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-8.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-8.no_search_link
# python中的可变数据类型和不可变数据类型，并简述原理
# 可变：list，dict，set # 值变的时候对应的内存不变
# 不可变：int，str，tuple，float， bool # 改变值内存地址也改变
# zip()函数用法：传入两个可迭代对象，将对象中的元素对应打包成一个元组，返回由这些元组组成的列表（列表长度由传入的可迭代对象最短长度确定）
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9, 10]
z1 = zip(a, b)
z2 = zip(a, c)
print(z1)
for i in z2:
    print(i)

# 编码成bytes类型
a1 = b'hello'
print(a1)

# 合并列表
a2 = b+c
print(a2)

# 移除字符串中的空格
s1 = '    1234'
print(s1.lstrip())
s2 = '1234    '
print(s2.rstrip())
s3 = '  1234   '
print(s3.strip())  # strip()默认删除字符串前后的空格和换行符，也可以指定要删的字符
s4 = '   12 34  '
print(''.join(s4.split()))

# 字符串大小写转换
s = 'I am from China'
print(s.lower())  # 全小写
print(s.upper())  # 全大写
print(s.title())  # 每个单词首字母大写
print(s.capitalize())  # 字符串第一个字母大写


# python中的闭包：函数的嵌套，内层函数使用外层函数的局部变量，外层函数的返回结果是内层函数
def layz_sum(*args):
    def sum():
        re = 0
        for i in args:
            re += 1
        return re
    return sum


s = layz_sum(1, 2, 3, 4, 5)
print(s, type(s), s(), sep='\n')

# 随机打乱一个列表里的元素
s = [1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(s)
print(s)

# python中的join（）和split（）函数
s1 = 'abcd'
s2 = '1234'
# join()将容器对象拆分并以指定字符拼接起来，返回字符串
print(' '.join(s1))
print('-'.join(s2))
# split()以指定字符分割字符串，返回列表list
s3 = 'I am Chinese'
print(s3.split())  # 默认空格，可指定分隔符和分割次数
print(s3.split(' ', 1))


# 字符串去重，从小到大排列
def str1(s):
    s1 = ''
    for i in s:
        if i not in s1:
            s1 += i
    return ''.join(sorted(s1))


print(str1('ajldjlajfdljfddd'))

# 用lambda函数实现两个数相乘,lambda函数（匿名函数）：即时使用简洁方便


def res(x, y): return x*y


print(res(5, 8))


# 计算一个字符串中的大写字母数量
def upper_num(s):
    n = 0
    for i in s:
        if i == i.upper():
            n += 1
    return n


print(upper_num('adsfFAF'))

# 负索引
n = [1, 2, 3]
print(n[0])
print(n[-3])
print(n[2])
print(n[-1])
print('--'*10)


# 如何在一个函数内部修改局部变量？（nonlocal）
# global 可以在函数内修改全局变量 3，2，3
# nonlocal 可以在函数内修改函数外的局部变量 3，3，1
# 不使用声明，不能修改全局变量，输出为3，2，1
n = 1


def test():
    n = 2

    def test1():
        # global n  #使用global  3，2，3
        # nonlocal n  #使用nonlocal 3，3，1
        n = 3
        return n
    t = test1()
    print(t)  # global 3，nonlocal 3
    return n  # global 2，nonlocal 3


print(test())
print(n)  # global 3，nonlocal 1

# 生成随机整数，随机小数，0-1之间的小数方法
print(random.random())  # 返回0-1之间的小数，不包含0，1
print(random.randint(10, 20))  # 返回10-20随机整数，包含10，20
print(random.uniform(10, 20))  # 返回10-20随机小数，不包含10，20

# 文件偏移量
with open('test.txt', 'w+', encoding='utf-8') as f:
    f.write('hello world! This is a good day.中华人民共和国')
    print("文件偏移量：", f.tell())  # 查看文件偏移量
with open('test.txt', 'r', encoding='utf-8') as f:
    data = f.read()
    print(data)
    f.seek(0)  # 　操作文件偏移量位置
    print(f.read(2))
    f.seek(32)
    print(f.read(2))
# f.seek()       #对文件进行指针偏移操作，有三个模式，
#     seek(0,0) 默认移动到文件开头或简写成seek(0)
#     seek(x,1) 表示从当前指针位置向后移x（正数）个字节，如果x是负数，则是当前位置向前移动x个字节
#     seek(x,2) 表示从文件末尾向前移x（正数）个字节，如果x负数，则是从末尾向前移动x个字节
#     注意： 必须以二进制方式打开文件时基准位置才能是1或者2
